﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Covariance_Contravariance
{
    class Program
    {
        delegate void FrutaAction<in T>(T a);

        static void Main(string[] args)
        {
            IList<Banana> listaDeBananas = new List<Banana>();

            listaDeBananas.Add(new Banana());
            listaDeBananas.Add(new Banana());
            listaDeBananas.Add(new Banana());

            // Covariance
            ComprarFrutas(listaDeBananas);

            // ...

            IList<Ananas> listaDeAnanas = new List<Ananas>();

            listaDeAnanas.Add(new Ananas());
            listaDeAnanas.Add(new Ananas());
            listaDeAnanas.Add(new Ananas());

            // Covariance
            ComprarFrutas(listaDeAnanas);

            
            // ...


            // Contravariance
            FrutaAction<Fruta> fruta = (f) => { Console.WriteLine(f); };
            FrutaAction<Ananas> ananas = fruta;

            fruta(new Banana());
            ananas(new Ananas());
        }

        static void ComprarFrutas(IEnumerable<Fruta> listaDeFrutas)
        {
            foreach (var f in listaDeFrutas)
            {
                Console.WriteLine("Fruta: {0}", f.Nome);
            }
        }
    }
}
